package com.csw;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;

import java.awt.*;

/**
 * @author A
 * @version 1.0
 * @description: TODO
 * @date 2022/11/24 3:55
 */
public class MapTop {
    //格子位置
    int temp_x;
    int temp_y;


    //重置游戏
    void regame(){
        for (int i=1;i<=GameUtil.Map_W;i++){
            for (int j=1;j<=GameUtil.Map_H;j++){
                //将所有格子重置为没有雷的状态
                GameUtil.DATA_TOP[i][j]=0;
            }
        }
    }
    //判断逻辑
    void logic(){
        //防止鼠标一直指向最后的区域
        temp_x=0;
        temp_y=0;
        //排除点击空白地方也会翻开
        if (GameUtil.MOUSE_X>GameUtil.OFFSET&&GameUtil.MOUSE_Y>3*GameUtil.OFFSET){
            temp_x=(GameUtil.MOUSE_X-GameUtil.OFFSET)/GameUtil.SQUARE_LENGTH+1;
            temp_y=(GameUtil.MOUSE_Y-GameUtil.OFFSET*3)/GameUtil.SQUARE_LENGTH+1;
        }

        if (temp_x>=1&&temp_x<=GameUtil.Map_W&&temp_y>=1&&temp_y<=GameUtil.Map_H){
            if (GameUtil.LEFT){
                //0覆盖 -1无覆盖
                if (GameUtil.DATA_TOP[temp_x][temp_y]==0){
                    GameUtil.DATA_TOP[temp_x][temp_y]=-1;
                }
                spaceOpen(temp_x, temp_y);
                GameUtil.LEFT=false;
            }

            if (GameUtil.RIGHT){
                //如果覆盖状态则插旗
                if (GameUtil.DATA_TOP[temp_x][temp_y] == 0) {
                    GameUtil.DATA_TOP[temp_x][temp_y] = 1;
                    GameUtil.flagCount++;
                }
                //如果插旗状态则取消(要加else否则瞬间取消插旗)
                else if (GameUtil.DATA_TOP[temp_x][temp_y] == 1) {
                    GameUtil.DATA_TOP[temp_x][temp_y] = 0;
                    GameUtil.flagCount--;
                }
                //如果右键已经打开的格子且是数字
                else if (GameUtil.DATA_TOP[temp_x][temp_y]==-1){
                    numOpen(temp_x, temp_y);
                }
                GameUtil.RIGHT=false;
            }
        }
        //失败判断
        boom();
        victory();
    }
    //打开空格(递归打开)
    void spaceOpen(int x,int y){
        if (GameUtil.DATA_BOTTOM[x][y]==0){
            for (int i=x-1;i<=x+1;i++){
                for (int j=y-1;j<=y+1;j++){
                    //只有未打开的格子才打开
                    if (GameUtil.DATA_TOP[i][j]!=-1){
                        //打开空格时,如果打开了旗子格子,旗子数--
                        if (GameUtil.DATA_TOP[i][j]==1){
                            GameUtil.flagCount--;
                        }
                        //顶层无图片显示打开格子
                        GameUtil.DATA_TOP[i][j]=-1;
                        //只有在雷区当中
                        if (i>=1&&j>=1&&i<=GameUtil.Map_W&&j>=1&&j<=GameUtil.Map_H){
                            spaceOpen(i, j);
                        }

                    }

                }
            }
        }
    }
    //数字翻开
    void numOpen(int x,int y){
        //记录旗子数目
        int count=0;
        //右键打开是数字,遍历周围3*3区域旗子数
        if (GameUtil.DATA_BOTTOM[x][y]>0){
            for (int i=x-1;i<=x+1;i++){
                for (int j=y-1;j<=y+1;j++){
                    if (GameUtil.DATA_TOP[i][j]==1){
                        count++;
                    }
                }
            }
        }
        //如果右键点击的数字等于旗子数目则递归打开格子
        if (GameUtil.DATA_BOTTOM[x][y]==count){
            for (int i=x-1;i<=x+1;i++){
                for (int j=y-1;j<=y+1;j++){
                    //只有未插旗的格子才打开
                    if (GameUtil.DATA_TOP[i][j]!=1){
                        //顶层无图片显示打开格子
                        GameUtil.DATA_TOP[i][j]=-1;
                        //只有在雷区当中
                        if (i>=1&&j>=1&&i<=GameUtil.Map_W&&j>=1&&j<=GameUtil.Map_H){
                            spaceOpen(i, j);
                        }

                    }

                }
            }
        }

    }

    //判断,,true为失败,false为未失败
    Boolean boom(){
        //如果旗子数目等于雷的数目,则打开所有未打开的格子
        if (GameUtil.flagCount==GameUtil.RAY_MAX) {
            for (int i = 1; i <= GameUtil.Map_W; i++) {
                for (int j = 1; j <= GameUtil.Map_H; j++) {
                       if (GameUtil.DATA_TOP[i][j]==0){
                           GameUtil.DATA_TOP[i][j]=-1;

                       }
                }
            }
        }
        //遍历整个雷区,如果底层为雷顶层无覆盖则为失败
        for (int i=1;i<=GameUtil.Map_W;i++){
            for (int j=1;j<=GameUtil.Map_H;j++){

                if (GameUtil.DATA_BOTTOM[i][j]==-1&&GameUtil.DATA_TOP[i][j]==-1){
                    GameUtil.state=2;
                    seeFalse();
                    return true;
                }
            }
        }
        return false;
    }
    //失败显示
    void seeFalse(){
        for (int i=1;i<=GameUtil.Map_W;i++){
            for (int j=1;j<=GameUtil.Map_H;j++){
                //如果顶层是旗子,地下不是雷,显示插错旗子
                if (GameUtil.DATA_BOTTOM[i][j]!=-1&&GameUtil.DATA_TOP[i][j]==1){
                    GameUtil.state=2;
                    GameUtil.DATA_TOP[i][j]=2;
                }
            }
        }
    }
    //胜利判断
    Boolean victory() {
        //记录未打开格子数量
        int count=0;
        for (int i = 1; i <= GameUtil.Map_W; i++) {
            for (int j = 1; j <= GameUtil.Map_H; j++) {
                if (GameUtil.DATA_TOP[i][j]!=-1&&GameUtil.DATA_TOP[i][j]!=2){
                    count++;
                }
            }
        }
        //如果未打开格子数量=雷的数量游戏胜利
        if (count==GameUtil.RAY_MAX){
            GameUtil.state=1;
            return true;
        }
        //其他情况未胜利
        return false;

    }
    void paintSelf(Graphics g){

        logic();

        //绘制方法
        for (int i = 1; i <= GameUtil.Map_W; i++) {
            for (int j = 1; j <= GameUtil.Map_H; j++) {
                //覆盖
                if (GameUtil.DATA_TOP[i][j]==0){
                    g.drawImage(GameUtil.cell,
                            GameUtil.OFFSET + (i - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.OFFSET * 3 + (j - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.SQUARE_LENGTH - 2,
                            GameUtil.SQUARE_LENGTH - 2,
                            null);
                }
                //插旗
                if (GameUtil.DATA_TOP[i][j]==1){
                    g.drawImage(GameUtil.flag,
                            GameUtil.OFFSET + (i - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.OFFSET * 3 + (j - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.SQUARE_LENGTH - 2,
                            GameUtil.SQUARE_LENGTH - 2,
                            null);
                }
                //插错旗
                if (GameUtil.DATA_TOP[i][j]==2){
                    g.drawImage(GameUtil.noflag,
                            GameUtil.OFFSET + (i - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.OFFSET * 3 + (j - 1) * GameUtil.SQUARE_LENGTH + 1,
                            GameUtil.SQUARE_LENGTH - 2,
                            GameUtil.SQUARE_LENGTH - 2,
                            null);
                }
            }


        }
    }


}
